package com.winglish.as3.utils 
{
	import com.winglish.as3.quiz.vo.DragTargetMc;
	
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.text.TextFieldType;
	/**
	 * ...
	 * @author charmjin
	 */
	public class QuizUtil 
	{
		public function QuizUtil(){}
		
		/**
		 * 줄바꿈.
		 * @param	str
		 * @return
		 */
		static public function newLine(str:String):String {
			return StringUtil.strReplace(str, "|", "\n");
		}
		
		/**
		 * findTxt의 텍스트 스타일 설정.
		 * @param	txt
		 * @param	obj
		 * @param	findTxt
		 * @param	count
		 */
		static public function changeTextFormatToString(txt:TextField, obj:Object, findTxt:String = "", count:int = 0):void {
			if (findTxt == "") {
				StringUtil.setChangeTextFormat(txt, obj);
			}else {
				if (count == 0) StringUtil.setChangeTextFormat(txt, obj, findTxt);
				else StringUtil.setChangeTextFormat(txt, obj, findTxt, count);
			}
		}
		
		/**
		 * 패턴 이용해서 텍스트 스타일 설정.
		 * @param	txt
		 * @param	obj
		 * @param	patternIndex
		 */
		static public function changeTextFormatToPattern(txt:TextField, obj:Object, patternIndex:int):void {
			var str:String = txt.text;
			var ary:Array = str.match( QuizSetData.Pattern[patternIndex] );

			if (ary.length > 0) {
				var indexArr:Array = new Array();
				var index:int = 0;
				var startStr:String = QuizSetData.Pattern[patternIndex].source.substr(1,1);
				var endStr:String = QuizSetData.Pattern[patternIndex].source.substr(-1);
				var format: TextFormat = txt.getTextFormat();
				
				for( var j: Object in obj ){
					if ( format.hasOwnProperty( j ) ) format[ j ] = obj[ j ];
					else trace( j, "라는 속성은 없습니다." );
				}
				
				for (var i:int = 0; i < ary.length; i++) {
					indexArr[i] = new Array();
					indexArr[i][0] = txt.text.indexOf(startStr, index) + 1;
					indexArr[i][1] = txt.text.indexOf(endStr, index) - 1;
					index = indexArr[i][1] + 2;
				}
				txt.text = StringUtil.strReplace(txt.text, startStr, "");
				txt.text = StringUtil.strReplace(txt.text, endStr, "");
				
				for (i = 0; i < ary.length; i++) {
					indexArr[i][0] = indexArr[i][0] - ((2 * i) + 1);
					indexArr[i][1] = indexArr[i][1] - (2 * i);
					txt.setTextFormat(format, indexArr[i][0], indexArr[i][1]);
				}
			}
		}
		
		/**
		 * 패턴 이용해서 changeTxt로 교체.
		 * @param	txt
		 * @param	patternIndex
		 * @param	changeTxt
		 */
		static public function changeTextBlank(txt:TextField, patternIndex:int, changeTxt:String = ""):void{
			var str:String = txt.text;
			var ary: Array = str.match( QuizSetData.Pattern[patternIndex] );
			var chgTxt:String = changeTxt;
			if (ary.length > 0) {
				var index:int = 0;
				for (var i:int = 0; i < ary.length; i++) {
					if (changeTxt == "") chgTxt = ary[i];
					if (txt.text.indexOf(ary[i], index)) {
						index = txt.text.indexOf(ary[i], index);
						var str1:String = txt.text.substring(0, index);
						var str2:String = txt.text.substr(index + ary[i].length, txt.text.length - index);
						txt.text = str1 + chgTxt + str2;
					}else {
						index++;
					}
				}
			}
		}
		
		/**
		 * 패턴 이용해서 DragTargetMc로 교체.
		 * @param	txt
		 * @param	patternIndex
		 * @param	changeTxt
		 */
		static public function changeMcBlank(txt:TextField, patternIndex:int, changeTxt:String = ""):Array {
			var str:String = txt.text;
			var ary: Array = str.match( QuizSetData.Pattern[patternIndex] );
			var boxArr:Array = new Array();
			
			if (ary.length > 0) {
				changeTextBlank(txt, patternIndex, changeTxt);
				var chgTxt:String = changeTxt;
				var index:int = 0;
				for (var i:int = 0; i < ary.length; i++) {
					if (changeTxt == "") chgTxt = ary[i];
					var tempRect:Rectangle = StringUtil.findTextCoordinate(txt, txt.text, chgTxt, index);
					var mc:DragTargetMc = new DragTargetMc();
					mc.x = txt.x + tempRect.x - 1;
					mc.y = txt.y + tempRect.y;
					mc.bgMc.width = mc.txt.width = tempRect.width + 3;
					mc.name = QuizSetData.targetMc + i;
					txt.parent.addChild(mc);
					boxArr.push(mc);
					index = txt.text.indexOf(chgTxt, index) + chgTxt.length;
				}
			}
			return boxArr;
		}
	
		
		/**
		 * 패턴 안의 텍스트 배열로 가져오기.
		 * @param	str
		 * @param	patternIndex
		 * @param   isPatternCha 패턴 텍스트 보여지는지 구분 값
		 * @return
		 */
		static public function patternTextArr(str:String, patternIndex:int, isPatternCha:Boolean = false):Array {
			var ary:Array = str.match( QuizSetData.Pattern[patternIndex] );
			if (ary.length > 0) {
				if (!isPatternCha) {
					for (var i:int = 0; i < ary.length; i++) {
						ary[i] = ary[i].substr(1,ary[i].length - 2);
					}					
				}
			}
			return ary;
		}
		
		/**
		 * pointMc의 좌표값을 targetMc을 기준으로 좌표값 계산.
		 * @param	pointMc 변환할 무비클립. 해당 좌표값으로 계산
		 * @param	targetMc 기준이 되는 무비클립
		 * @return 좌표값
		 */
		static public function changeGlobalToLocal(pointMc:MovieClip, targetMc:MovieClip):Point {
			var newPoint:Point = new Point(pointMc.x, pointMc.y);
			var parent:DisplayObject = pointMc.parent;
			do {
				if (parent) {
					newPoint.x += parent.x;
					newPoint.y += parent.y;
				}
				parent = parent.parent;
			}while (parent)
			return targetMc.globalToLocal(newPoint);
		}
		
		/**
		 * 정해진 인덱스 순서에 따라 배열을 정렬한다.
		 * @param	index
		 * @param	sortArr
		 * @return
		 */
		static public function randomSort(index:Array, sortArr:Array):Array {
			var arr:Array = new Array();
			if(index.length == sortArr.length){
				for (var i:int = 0; i < index.length; i++) {
					arr.push(sortArr[index[i]]);
				}
			}else {
				throw new Error( "순서 인덱스 길이랑 배열 길이가 다릅니다." );
				return null;
			}
			return arr;
		}
		
		/**
		 * 대문자 -> 소문자로 변형(대문자 I는 제외)
		 * @param	str
		 * @return
		 */
		static public function toLowerCase(str:String, exceptTxt:Array):String {
			//var arr:Array = str.split("I");
			var arr:Array = str.split(" ");
			for (var i:int = 0; i < arr.length; i++) {
				if (exceptTxt.indexOf(arr[i]) == -1) {
					arr[i] = arr[i].toLowerCase();
				}
				
			}
			return arr.join(" ");
		}
		
		/**
		 * 문장의 앞/뒤 빈칸 제거.
		 * @param	str
		 * @return
		 */
		static public function trim(str:String):String {
			return StringUtil.RTrim(StringUtil.LTrim(str));
		}
		
		/**
		 * 텍스트 필드의 타입을 변경
		 * @param	boo true : input타입, false : dynamic타입
		 * @param	arr
		 */
		static public function changeTextType(boo:Boolean, arr:Array):void {
			for (var i:int = 0; i < arr.length; i++) {
				if (arr[i].txt) {
					if (boo) arr[i].txt.type = TextFieldType.INPUT;
					else arr[i].txt.type = TextFieldType.DYNAMIC;
				}
			}
		}

		/**
		 * input 텍스트와 정답이 모두 같은지 비교.
		 * @param	dapArr
		 * @param	inputArr
		 * @return
		 */
		static public function equalDapInput(dapArr:Array, inputArr:Array):Boolean {
			var result:Boolean = true;
			for (var i:int = 0; i < dapArr.length; i++) {
				if (dapArr[i] != trim(inputArr[i].txt.text)) {
					result = false;
					break;
				}
			}
			return result;
		}
		
		/**
		 * 빈칸에 모두 입력 했는지 체크.
		 * @param	arr blankMc 배열값.
		 * @return false : 모두 입력 상태.
		 */
		static public function inputBlank(arr:Array):Boolean {
			var blank:Boolean = false;
			for (var i:int = 0; i < arr.length;i++){
				if (StringUtil.LTrim(arr[i].txt.text) == "") {
					blank = true;
					break;
				}
			}
			return blank;
		}
		
		/**
		 * 보기를 선택했는지 체크.
		 * @param	arr
		 * @return
		 */
		static public function chkBlank(arr:Array):Boolean {
			var blank:Boolean = true;
			for (var i:int = 0; i < arr.length; i++) {
				if (arr[i].currentFrame == 2) {
					blank = false;
					break;
				}
			}
			return blank;
		}
		
		/**
		 * arr 배열에서 선택되어 있는 상태인 인덱스 값 가져오기
		 * @param	arr
		 * @return
		 */
		static public function itemSelectedIndex(arr:Array):int {
			var num:int = -1;
			for (var i:int = 0; i < arr.length; i++) {
				if (arr[i].currentFrame == 2) {
					num = i;
				}
			}
			return num;
		}
		
		/**
		 * 패턴 안의 텍스트 가져오기.
		 * @param	str
		 * @param	patternType
		 * @return
		 */
		static public function patternText(str:String, patternType:int):String {
			var result:String = String(QuizSetData.Pattern[patternType]);
			var tmpStr:String = str.match(QuizSetData.Pattern[patternType])[0];
			return StringUtil.strRemove(tmpStr, result.substr(2, 1), result.substr(7, 1));
		}
	}

}